package com.z.redis.command.impl.string;

import com.z.redis.RedisCore;
import com.z.redis.command.Command;
import com.z.redis.command.CommandType;
import com.z.redis.datatype.BytesWrapper;
import com.z.redis.datatype.RedisData;
import com.z.redis.datatype.RedisString;
import com.z.redis.resp.BulkString;
import com.z.redis.resp.Resp;
import io.netty.channel.ChannelHandlerContext;

/**
 * 获得键值对
 */
public class Get implements Command {
    private BytesWrapper key;
    @Override
    public CommandType type(){
        return CommandType.get;
    }

    /**
     * get key
     * @param array 命令内容
     */
    @Override
    public void setContent(Resp[] array){
        key = ((BulkString) array[1]).getContent();
    }

    @Override
    public void handle(ChannelHandlerContext ctx, RedisCore redisCore){
        RedisData redisData = redisCore.get(key);
        if(redisData == null){
            ctx.writeAndFlush(BulkString.NullBulkString);
        }else if(redisData instanceof RedisString){
            BytesWrapper value = ((RedisString) redisData).getValue();
            ctx.writeAndFlush(new BulkString(value));
        }else{
            throw new UnsupportedOperationException();
        }
    }
}
